home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 October / macformat-029.iso / mac / Shareware City / HyperCard / CapsKey ƒ / XCmdStuff.h < prev   
Encoding:
Text File  |  1995-04-11  |  5.0 KB  |  206 lines  |  [TEXT/KAHL]

  1. /*
  2.  *    XCmdStuf.h
  3.  *
  4.  *    By Theron Trowbridge
  5.  *    © 1994, all rights reserved
  6.  *
  7.  *    A library of utility routines for use in XCMDs and XFCNs.
  8.  *    Some of these were adapted from the book "XCMDs for Hypercard" by Gary Bond.
  9.  *    The strlen() function came from the K&R C book.
  10.  *
  11.  *    Permission for use in non-commercial projects granted.
  12.  *
  13.  */
  14.  
  15.  
  16. /********    Standard XCMD Routines    ********/
  17.  
  18. void            MoveLockParams(XCmdPtr paramPtr, short paramCount);
  19. void            UnlockParams(XCmdPtr paramPtr, short paramCount);
  20. void            ReturnMessage( XCmdPtr paramPtr, Str255 message );
  21. void            ReturnError( XCmdPtr paramPtr, OSErr fileError );
  22. short            GetParamShort( XCmdPtr paramPtr, short paramNum );
  23. unsigned short    GetParamUShort( XCmdPtr paramPtr, short paramNum );
  24. long            GetParamLong( XCmdPtr paramPtr, short paramNum );
  25. unsigned long    GetParamULong( XCmdPtr paramPtr, short paramNum );
  26. short            strlen(char *str);
  27.  
  28.  
  29.  
  30. /*
  31.  *    Move into high memory the pointers in the parameter block
  32.  *    passed by Hypercard and lock them there so we can refer
  33.  *    to them safely.
  34.  */
  35.  
  36. void    MoveLockParams( XCmdPtr paramPtr, short paramCount )
  37. {
  38.     short i;
  39.     
  40.     for (i=0; i <= paramCount - 1; i++)
  41.     {
  42.         MoveHHi(paramPtr->params[i]);
  43.         HLock(paramPtr->params[i]);    
  44.     }
  45. }
  46.  
  47.  
  48.  
  49. /*
  50.  *    Unlock the pointers in the parameter block so that we
  51.  *    don't muck up memory.
  52.  */
  53.  
  54. void    UnlockParams(XCmdPtr paramPtr, short paramCount)
  55. {
  56.     short i;
  57.     
  58.     for(i = 0; i <= paramCount-1; i++)    {
  59.         HUnlock(paramPtr->params[i]);    
  60.     }
  61. }
  62.  
  63.  
  64.  
  65. /*
  66.  *    Set the return value in the parameter block with a string.
  67.  */
  68.  
  69. void    ReturnMessage( XCmdPtr paramPtr, Str255 message )
  70. {
  71.     paramPtr->returnValue = PasToZero( paramPtr, message );
  72.     UnlockParams( paramPtr, paramPtr->paramCount );
  73. }
  74.  
  75.  
  76.  
  77. /*
  78.  *    Interpret file manager OSErr value and set the return value
  79.  *    with a slightly more human-perceivable version of it.
  80.  */
  81.  
  82. void    ReturnError( XCmdPtr paramPtr, OSErr fileError )
  83. {
  84.     switch ( fileError )
  85.     {
  86.         case eofErr:
  87.             ReturnMessage( paramPtr, "\pError: End of file" );
  88.             break;
  89.         case extFSErr:
  90.             ReturnMessage( paramPtr, "\pError: External file system" );
  91.             break;
  92.         case dskFulErr:
  93.             ReturnMessage( paramPtr, "\pError: Disk full" );
  94.             break;
  95.         case dupFNErr:
  96.             ReturnMessage( paramPtr, "\pError: File found instead of folder" );
  97.             break;
  98.         case fLckdErr:
  99.             ReturnMessage( paramPtr, "\pError: File locked" );
  100.             break;
  101.         case fnfErr:
  102.             ReturnMessage( paramPtr, "\pError: File/Folder not found" );
  103.             break;
  104.         case fnOpnErr:
  105.             ReturnMessage( paramPtr, "\pError: File not open" );
  106.             break;
  107.         case ioErr:
  108.             ReturnMessage( paramPtr, "\pError: I/O error" );
  109.             break;
  110.         case paramErr:
  111.             ReturnMessage( paramPtr, "\pError: Negative count" );
  112.             break;
  113.         case posErr:
  114.             ReturnMessage( paramPtr, "\pError: Attempt to position position before start of file" );
  115.             break;
  116.         case rfNumErr:
  117.             ReturnMessage( paramPtr, "\pError: Bad reference number" );
  118.             break;
  119.         case vLckdErr:
  120.             ReturnMessage( paramPtr, "\pError: Software volume lock" );
  121.             break;
  122.         case wPrErr:
  123.             ReturnMessage( paramPtr, "\pError: Hardware volume lock" );
  124.             break;
  125.         case wrPermErr:
  126.             ReturnMessage( paramPtr, "\pError: Read/write permission doesn't allow writing" );
  127.             break;
  128.         default:
  129.             ReturnMessage( paramPtr, "\pError: Unknown error" );
  130.             break;
  131.     }
  132. }
  133.  
  134.  
  135.  
  136. /*
  137.  *    These routines retrieve a given parameter as a short, long, signed, or unsigned integer.
  138.  *
  139.  */
  140.  
  141. short    GetParamShort( XCmdPtr paramPtr, short paramNum )
  142. {
  143.     short    i, paramLength;
  144.     Str255    paramString, pasParamString;
  145.     
  146.     paramLength = strlen( *paramPtr->params[paramNum] );
  147.     for ( i = 0; i <= paramLength; i++ );
  148.         paramString[i] = (*paramPtr->params[paramNum])[i];
  149.     ZeroToPas( paramPtr, (char *) paramString, pasParamString );
  150.     return( StrToNum( paramPtr, pasParamString ) );
  151. }
  152.  
  153.  
  154. unsigned short    GetParamUShort( XCmdPtr paramPtr, short paramNum )
  155. {
  156.     short    i, paramLength;
  157.     Str255    paramString, pasParamString;
  158.     
  159.     paramLength = strlen( *paramPtr->params[paramNum] );
  160.     for ( i = 0; i <= paramLength; i++ );
  161.         paramString[i] = (*paramPtr->params[paramNum])[i];
  162.     ZeroToPas( paramPtr, (char *) paramString, pasParamString );
  163.     return( StrToLong( paramPtr, pasParamString ) );
  164. }
  165.  
  166.  
  167. long    GetParamLong( XCmdPtr paramPtr, short paramNum )
  168. {
  169.     short    i, paramLength;
  170.     Str255    paramString, pasParamString;
  171.     
  172.     paramLength = strlen( *paramPtr->params[paramNum] );
  173.     for ( i = 0; i <= paramLength; i++ );
  174.         paramString[i] = (*paramPtr->params[paramNum])[i];
  175.     ZeroToPas( paramPtr, (char *) paramString, pasParamString );
  176.     return( StrToNum( paramPtr, pasParamString ) );
  177. }
  178.  
  179.  
  180. unsigned long    GetParamULong( XCmdPtr paramPtr, short paramNum )
  181. {
  182.     short    i, paramLength;
  183.     Str255    paramString, pasParamString;
  184.     
  185.     paramLength = strlen( *paramPtr->params[paramNum] );
  186.     for ( i = 0; i <= paramLength; i++ )
  187.         paramString[i] = (*paramPtr->params[paramNum])[i];
  188.     ZeroToPas( paramPtr, (char *) paramString, pasParamString );
  189.     return( StrToLong( paramPtr, paramString ) );
  190. }
  191.  
  192.  
  193.  
  194. /*
  195.  *    My quickie version of the standard C lib strlen -
  196.  *    so I don't have to include stdio.h.
  197.  */
  198.  
  199. short    strlen(char *str)
  200. {
  201.     char *ptr = str;
  202.     
  203.     while (*ptr != '\0')
  204.         ptr++;
  205.     return ptr - str;
  206. }